package Sonnet;

import java.awt.Dimension;

import javafx.application.Application;

import javafx.application.Platform;
import javafx.scene.Scene;
import javafx.stage.Stage;

import javafx.fxml.FXMLLoader;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
import javafx.scene.SnapshotParameters;


import java.awt.*;
import java.awt.image.*;
import java.awt.event.ActionEvent;
import java.awt.Dimension;
import java.lang.Object;
import java.io.InputStream;
import java.io.File;
import javax.imageio.ImageIO;//Keep For .png Image Creation
import java.io.IOException;
import java.nio.ByteBuffer;

import javafx.scene.paint.Color;
import javafx.geometry.Rectangle2D;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.StackPane;
import javafx.scene.image.*;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.image.PixelReader;
import javafx.scene.image.PixelWriter;
import javafx.scene.image.WritableImage;
import javafx.scene.input.KeyEvent;
//import javafx.scene.layout.VBox;
import javafx.scene.text.*;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.scene.layout.*;
//import javafx.scene.paint.Color;
//import javafx.scene.shape.*;

//import java.util.Timer;
//import java.util.TimerTask;
import javax.swing.JFileChooser;
//import javafx.stage.DirectoryChooser;
//import javafx.stage.FileChooser;
import javafx.embed.swing.SwingFXUtils;
import org.jcodec.api.awt.SequenceEncoder;//Keep For .mp4 Video Creation

public class Sonnet extends Application
{

	@Override
	public void start(Stage stage) throws IOException
	{
		//RainbowSystem(stage);
		//stage.setScene(new Scene(test.getView(), 300, 250));
		//stage.show();

		// update text in 5 seconds:

		Thread thread = new Thread(() -> {
			try { Thread.sleep(4000); }
			catch (InterruptedException exc) { throw new Error("Unexpected interruption", exc); }
			// Update text on FX Application Thread:
			Platform.runLater(new Runnable() {
				@Override
				public void run()
				{
					try { RainbowSystem(stage); }
					catch(IOException ie) { ie.printStackTrace(); }
				}
			});
			//stage.setScene(scene);
			//stage.setFullScreen(true);
			//stage.show();
		});
		thread.setDaemon(true);
		thread.start();

	}
	
	//http://www.tutorialized.com/tutorial/JavaFX-2-Full-Screen-Scene/76585
	static void RainbowSystem(Stage primaryStage) throws IOException
	{
		int usedMaxX = 1920;
		int usedMaxY = 1080;
		
		primaryStage.setTitle("Sonnet");
		primaryStage.setWidth(usedMaxX);
		primaryStage.setHeight(usedMaxY);

		// This is how you know how much screen you can write to.
		Screen screen = Screen.getPrimary();
		Rectangle2D bounds = screen.getVisualBounds();
		System.out.println(bounds);

		Dimension dimension = new Dimension( (int)bounds.getWidth(), (int)bounds.getHeight() );
		dimension.width = (int)bounds.getWidth();
		dimension.height = (int)bounds.getHeight() + 40;
		Dimension Dim = dimension;
		
		double fRateDivisor = 444;//HERE HERE HERE DETERMINES FRAME RATE AND RAINBOW MOVEMENT RATE

		//FXMLLoader loader = new FXMLLoader(Sonnet.class.getResource("main.fxml"));
		
		WebView browser = new WebView();
		WebEngine webEngine = browser.getEngine();
		webEngine.load("http://www.pixies.zone/PixiesTest.html");

		StackPane stackPane[] = new StackPane[(int)(fRateDivisor + 1)];
		stackPane[0] = new StackPane();
		stackPane[0].setPrefSize(usedMaxX, usedMaxY);//stackPane.setPrefSize(1920, 1080);//stackPane.setPrefSize(960, 540);
		
		Scene scene[] = new Scene[(int)(fRateDivisor + 1)];
		scene[0] = browser.getScene();
		scene[0] = new Scene(stackPane[0]);
		
		WritableImage writableWaterMark = new WritableImage(dimension.width, dimension.height);
		SnapshotParameters sP = new SnapshotParameters();
		sP.setViewport(bounds);
		scene[0].setRoot(browser);
		scene[0].snapshot(browser.snapshot(sP, writableWaterMark));//[0]);
		
		
				
		//try { SequenceEncoder enc = new SequenceEncoder(file); }
		//catch(IOException ie) { ie.printStackTrace(); }   
		primaryStage.setFullScreen(true);
		
		//Dim.width = 400;
		//Dim.height = 200;

		//PixelWriter pixelWriter = writableImage.getPixelWriter();
		//WritableImage wi = new WritableImage(
		//		(int)primaryStage.getWidth(),
		//		(int)primaryStage.getHeight());
		
		ImageView imageView = new ImageView();
		
		stackPane[0].getChildren().add(imageView);
		primaryStage.setScene(scene[0]);
		primaryStage.setFullScreen(true);
		primaryStage.show();
		
		final Image image = scene[0].snapshot(null);
		
		WritableImage writableImage = new WritableImage(dimension.width, dimension.height);
		PixelWriter pw = writableImage.getPixelWriter();
		PixelReader pr = writableImage.getPixelReader();
		//final Image image = new Image("http://www.nanofirm.org/scimagorder.com/Pictures/Pixies%20Text.png");
		PixelWriter pwWaterMark = writableWaterMark.getPixelWriter();
		PixelReader prWaterMark = writableWaterMark.getPixelReader();
		ColorSlider black = new ColorSlider( new double[]{0,0,0} );

		pw = writableImage.getPixelWriter();
		pr = writableImage.getPixelReader();
		
		ColorSlider startColor = black;
				
		for (int x = 0; x < dimension.width; x++)
			for (int y = 0; y < dimension.height; y++)
			{
				//pwWaterMark.setArgb(x, y, prWaterMark.getArgb(x, y));
				pw.setArgb( x, y, (int)(255 * 16777216 + (int)startColor.RGB[0] * 65536 + (int)startColor.RGB[1] * 256 + (int)startColor.RGB[2]));
			}
		imageView.setImage(writableImage);
						
		stackPane[1] = new StackPane();
		stackPane[1].snapshot(sP, writableImage);
		stackPane[1].getChildren().add(imageView);
		
		primaryStage.setScene(scene[1]);
		primaryStage.setFullScreen(true);
		primaryStage.show();
		
		System.out.println("Done Making Video");

		/*scene.setOnKeyReleased(new EventHandler<KeyEvent>()
		{
			@Override
			public void handle(KeyEvent event)
			{
				if ( event.isAltDown() == true)
				{
					switch (event.getCode())
					{
						case ENTER: primaryStage.setFullScreen(!primaryStage.isFullScreen()); break;
					}
				}
			}
		});//*/
	}
	
	public static void main(String[] args) throws IOException
	{
		launch(args);
	}
}